package com.gitee.swsk33.algorithms.lineartable.sequencelist;

/**
 * 线性表
 */
public class MyList {

	/**
	 * 线性表最大长度，也是初始分配给线性表的长度
	 */
	private final int maxLength = 100;

	/**
	 * 线性表当前长度
	 */
	private int length = 0;

	/**
	 * 存放线性表内容的数组
	 */
	private int[] contents;

	/**
	 * 构造函数用于初始化一个线性表
	 */
	public MyList() {
		contents = new int[maxLength];
	}

	/**
	 * 在尾部插入元素
	 *
	 * @param number 待插入元素
	 */
	public void add(int number) throws Exception {
		if (length >= maxLength) {
			throw new Exception("超出界限！");
		}
		// 一般来说，数组下标从0开始，因此长度这个数值作为下标的时候通常是数组最后一个的后一个
		contents[length] = number;
		length++;
	}

	/**
	 * 在指定位置插入元素
	 *
	 * @param number 插入元素
	 * @param index  插入位置，0代表在第一个插入
	 */
	public void add(int number, int index) throws Exception {
		if (length >= maxLength) {
			throw new Exception("超出界限！");
		}
		// 插入的时候，要把从插入位置开始的元素都向后移一位，从最后一个开始往后移当然是比较好的
		for (int i = length - 1; i >= index; i--) {
			contents[i + 1] = contents[i];
		}
		// 然后把指定位置赋值
		contents[index] = number;
		length++;
	}

	/**
	 * 删除一个元素
	 *
	 * @param index 待删除元素位置
	 */
	public void delete(int index) throws Exception {
		if (index < 0 || index >= length) {
			throw new Exception("输入参数不合法！");
		}
		// 移除指定位置元素的时候，需要把该位置之后所有元素往前移一位，当然我们直接从指定索引处的后一位开始即可
		for (int i = index + 1; i < length; i++) {
			contents[i - 1] = contents[i];
		}
		length--;
	}

	/**
	 * 修改一个元素
	 *
	 * @param index  待修改元素位置
	 * @param number 修改元素后的新值
	 */
	public void set(int index, int number) throws Exception {
		if (index < 0 || index >= length) {
			throw new Exception("输入参数不合法！");
		}
		// 很简单，直接赋值即可
		contents[index] = number;
	}

	/**
	 * 获取指定索引处元素值
	 *
	 * @param index 获取元素位置索引
	 * @return 获取到的元素
	 */
	public int get(int index) throws Exception {
		if (index < 0 || index >= length) {
			throw new Exception("输入参数不合法！");
		}
		// 很简单，直接返回即可
		return contents[index];
	}

	/**
	 * 打印该线性表所有内容
	 */
	public void printList() {
		for (int i = 0; i < length; i++) {
			System.out.print(contents[i] + " ");
		}
		System.out.println();
	}

	/**
	 * 获取线性表长度
	 *
	 * @return 线性表长度
	 */
	public int getLength() {
		return length;
	}

}